package com.swak.fx.support.ui;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

import javafx.css.CssMetaData;
import javafx.css.Styleable;
import javafx.scene.layout.Region;

/**
 * 组件的生命周期
 * 
 * @author 618lf
 */
public interface UILifecycle {

	List<String> getStylesheets();

	default void addStylesheets(String... stylesheetFile) {
		for (String file : stylesheetFile) {
			String stylesheet = UI.load(file);
			getStylesheets().add(stylesheet);
		}
	}

	// ================================================================================
	// 初始化
	// ================================================================================

	default void init() {
		initializeParts();
		layoutParts();
		setupEventHandlers();
		setupValueChangedListeners();
		setupBindings();
		initializeFinish();
	}

	default void initializeParts() {
	}

	default void layoutParts() {
	}

	default void setupEventHandlers() {
	}

	default void setupValueChangedListeners() {
	}

	default void setupBindings() {
	}

	default void initializeFinish() {
	}

	default boolean isDestoryed() {
		return false;
	}

	default void destory() {
	}

	default void useComputedSize(Region node) {
		node.setMinHeight(-1);
		node.setMaxHeight(-1);
		node.setMinWidth(-1);
		node.setMaxWidth(-1);
		node.setPrefHeight(-1);
		node.setPrefWidth(-1);
	}

	default void windowStateChange(int state) {

	}

	// ================================================================================
	// CssMetaData
	// ================================================================================
	/**
	 * 自定义 Css 属性编辑
	 * 
	 * @param styleable
	 * @param cssMetaData
	 * @return
	 */
	@SafeVarargs
	public static List<CssMetaData<? extends Styleable, ?>> cssMetaDataList(
			List<CssMetaData<? extends Styleable, ?>> styleable, CssMetaData<? extends Styleable, ?>... cssMetaData) {
		CssMetaDataList styleableMetaData = new CssMetaDataList(styleable);
		styleableMetaData.addAll(cssMetaData);
		return styleableMetaData.toUnmodifiable();
	}

	public static class CssMetaDataList extends ArrayList<CssMetaData<? extends Styleable, ?>> {
		private static final long serialVersionUID = 1L;

		public CssMetaDataList() {
		}

		public CssMetaDataList(Collection<? extends CssMetaData<? extends Styleable, ?>> c) {
			super(c);
		}

		@SafeVarargs
		public final boolean addAll(CssMetaData<? extends Styleable, ?>... cssMetaData) {
			return Collections.addAll(this, cssMetaData);
		}

		public List<CssMetaData<? extends Styleable, ?>> toUnmodifiable() {
			return Collections.unmodifiableList(this);
		}
	}
}
